/**
 * 用户相关接口
 * @module api/user
 * @description 用户认证、用户信息管理、地址管理等接口
 */
import request from './request';
import { loginResponse, logoutResponse, userInfo } from '../mock/user';

// 开发环境使用模拟数据
const useMock = process.env.NODE_ENV === 'development';

/**
 * 微信登录
 * @param {Object} params 登录参数
 * @param {String} params.code 微信登录获取的临时凭证
 * @param {Object} [params.userInfo] 用户信息对象(可选)
 * @param {String} [params.userInfo.nickName] 用户昵称
 * @param {String} [params.userInfo.avatarUrl] 用户头像
 * @param {Number} [params.userInfo.gender] 用户性别(0:未知，1:男，2:女)
 * @returns {Promise<Object>} 返回登录结果
 * @returns {Number} returns.code 状态码，200表示成功
 * @returns {String} returns.message 状态信息
 * @returns {Object} returns.data 返回的数据对象
 * @returns {String} returns.data.token 用户令牌
 * @returns {Object} returns.data.userInfo 用户信息
 */
export const wechatLogin = (params) => {
  if (useMock) {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve(loginResponse);
      }, 1000);
    });
  }
  return request.post('/user/wechat-login', params);
};

/**
 * 退出登录
 * @returns {Promise<Object>} 退出结果
 * @returns {Number} returns.code 状态码，200表示成功
 * @returns {String} returns.message 状态信息
 * @returns {Object|null} returns.data 返回的数据对象，退出通常为null
 */
export const logout = () => {
  if (useMock) {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve(logoutResponse);
      }, 500);
    });
  }
  return request.post('/user/logout');
};

/**
 * 获取用户信息
 * @returns {Promise<Object>} 用户信息响应
 * @returns {Number} returns.code 状态码，200表示成功
 * @returns {String} returns.message 状态信息
 * @returns {Object} returns.data 用户信息对象
 * @returns {Number} returns.data.id 用户ID
 * @returns {String} returns.data.name 用户名称
 * @returns {String} returns.data.avatar 用户头像
 * @returns {Number} returns.data.gender 用户性别
 * @returns {String} returns.data.phone 手机号
 * @returns {String} returns.data.email 邮箱
 * @returns {String} returns.data.bio 个人简介
 * @returns {String} returns.data.school 学校
 * @returns {String} returns.data.major 专业
 * @returns {String} returns.data.grade 年级
 * @returns {Number} returns.data.balance 余额
 * @returns {Number} returns.data.points 积分
 * @returns {Number} returns.data.level 等级
 * @returns {Array} returns.data.addresses 地址列表
 */
export const getUserInfo = () => {
  if (useMock) {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve({
          code: 200,
          message: '获取成功',
          data: userInfo
        });
      }, 500);
    });
  }
  return request.get('/user/info');
};

/**
 * 更新用户信息
 * @param {Object} params 用户信息
 * @param {String} [params.name] 用户名称
 * @param {String} [params.avatar] 用户头像
 * @param {Number} [params.gender] 用户性别
 * @param {String} [params.phone] 手机号
 * @param {String} [params.email] 邮箱
 * @param {String} [params.bio] 个人简介
 * @param {String} [params.school] 学校
 * @param {String} [params.major] 专业
 * @param {String} [params.grade] 年级
 * @returns {Promise<Object>} 更新结果
 * @returns {Number} returns.code 状态码，200表示成功
 * @returns {String} returns.message 状态信息
 * @returns {Object} returns.data 更新后的用户信息
 */
export const updateUserInfo = (params) => {
  if (useMock) {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve({
          code: 200,
          message: '更新成功',
          data: { ...userInfo, ...params }
        });
      }, 500);
    });
  }
  return request.put('/user/info', params);
};

/**
 * 获取用户地址列表
 * @returns {Promise<Object>} 地址列表响应
 * @returns {Number} returns.code 状态码，200表示成功
 * @returns {String} returns.message 状态信息
 * @returns {Array} returns.data 地址列表数组
 * @returns {Number} returns.data[].id 地址ID
 * @returns {String} returns.data[].name 收件人姓名
 * @returns {String} returns.data[].phone 收件人电话
 * @returns {String} returns.data[].province 省份
 * @returns {String} returns.data[].city 城市
 * @returns {String} returns.data[].district 区/县
 * @returns {String} returns.data[].address 详细地址
 * @returns {Boolean} returns.data[].isDefault 是否默认地址
 */
export const getAddressList = () => {
  if (useMock) {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve({
          code: 200,
          message: '获取成功',
          data: userInfo.addresses || []
        });
      }, 500);
    });
  }
  return request.get('/user/address/list');
};

/**
 * 添加地址
 * @param {Object} params 地址信息
 * @param {String} params.name 收件人姓名
 * @param {String} params.phone 收件人电话
 * @param {String} params.province 省份
 * @param {String} params.city 城市
 * @param {String} params.district 区/县
 * @param {String} params.address 详细地址
 * @param {Boolean} [params.isDefault=false] 是否默认地址
 * @returns {Promise<Object>} 添加结果
 * @returns {Number} returns.code 状态码，200表示成功
 * @returns {String} returns.message 状态信息
 * @returns {Object} returns.data 新增的地址对象
 */
export const addAddress = (params) => {
  if (useMock) {
    return new Promise((resolve) => {
      const addresses = [...(userInfo.addresses || [])];
      const newId = addresses.length > 0 ? Math.max(...addresses.map(a => a.id)) + 1 : 1;
      const newAddress = { ...params, id: newId };
      
      // 如果是默认地址，取消其他地址的默认状态
      if (newAddress.isDefault) {
        addresses.forEach(item => item.isDefault = false);
      }
      
      addresses.push(newAddress);
      userInfo.addresses = addresses;
      
      setTimeout(() => {
        resolve({
          code: 200,
          message: '添加成功',
          data: newAddress
        });
      }, 500);
    });
  }
  return request.post('/user/address', params);
};

/**
 * 更新地址
 * @param {Number} id 地址ID
 * @param {Object} params 地址信息
 * @param {String} [params.name] 收件人姓名
 * @param {String} [params.phone] 收件人电话
 * @param {String} [params.province] 省份
 * @param {String} [params.city] 城市
 * @param {String} [params.district] 区/县
 * @param {String} [params.address] 详细地址
 * @param {Boolean} [params.isDefault] 是否默认地址
 * @returns {Promise<Object>} 更新结果
 * @returns {Number} returns.code 状态码，200表示成功，404表示地址不存在
 * @returns {String} returns.message 状态信息
 * @returns {Object} returns.data 更新后的地址对象
 */
export const updateAddress = (id, params) => {
  if (useMock) {
    return new Promise((resolve, reject) => {
      const addresses = [...(userInfo.addresses || [])];
      const index = addresses.findIndex(a => a.id === id);
      
      if (index === -1) {
        return reject({
          code: 404,
          message: '地址不存在'
        });
      }
      
      // 如果是默认地址，取消其他地址的默认状态
      if (params.isDefault) {
        addresses.forEach(item => item.isDefault = false);
      }
      
      addresses[index] = { ...addresses[index], ...params };
      userInfo.addresses = addresses;
      
      setTimeout(() => {
        resolve({
          code: 200,
          message: '更新成功',
          data: addresses[index]
        });
      }, 500);
    });
  }
  return request.put(`/user/address/${id}`, params);
};

/**
 * 删除地址
 * @param {Number} id 地址ID
 * @returns {Promise<Object>} 删除结果
 * @returns {Number} returns.code 状态码，200表示成功
 * @returns {String} returns.message 状态信息
 * @returns {null} returns.data 数据字段可能为空
 */
export const deleteAddress = (id) => {
  if (useMock) {
    return new Promise((resolve) => {
      const addresses = (userInfo.addresses || []).filter(a => a.id !== id);
      userInfo.addresses = addresses;
      
      setTimeout(() => {
        resolve({
          code: 200,
          message: '删除成功',
          data: null
        });
      }, 500);
    });
  }
  return request.delete(`/user/address/${id}`);
};
